//package com.ssy.lingxi.pay.crypto;
//
//import java.security.MessageDigest;
//
//
///**
// * @Description:
// * @Author: HuangJieZhou
// * @Date: 2021/12/23 18:05
// * @Version: 2.0.0
// **/
//public class MD5 extends MessageDigest {
//    public static final String ident = "$Id: MD5.java,v 1.5 1998/10/05 05:46:52 dgh Exp $";
//
//    int H1;
//
//    int H2;
//
//    int H3;
//
//    int H4;
//
//    int count;
//
//    int[] X;
//
//    private byte[] buffer;
//
//    private static final int MAGIC1 = 1732584193;
//
//    private static final int MAGIC2 = -271733879;
//
//    private static final int MAGIC3 = -1732584194;
//
//    private static final int MAGIC4 = 271733878;
//
//    private static final int S11 = 7;
//
//    private static final int S12 = 12;
//
//    private static final int S13 = 17;
//
//    private static final int S14 = 22;
//
//    private static final int S21 = 5;
//
//    private static final int S22 = 9;
//
//    private static final int S23 = 14;
//
//    private static final int S24 = 20;
//
//    private static final int S31 = 4;
//
//    private static final int S32 = 11;
//
//    private static final int S33 = 16;
//
//    private static final int S34 = 23;
//
//    private static final int S41 = 6;
//
//    private static final int S42 = 10;
//
//    private static final int S43 = 15;
//
//    private static final int S44 = 21;
//
//    public MD5() {
//        super("MD5");
//        this.buffer = new byte[64];
//        engineReset();
//        this.X = new int[16];
//    }
//
//    private final int F(int i, int j, int k) {
//        return i & j | (i ^ 0xFFFFFFFF) & k;
//    }
//
//    private final int FF(int i, int j, int k, int l, int i1, int j1, int k1) {
//        i += F(j, k, l) + i1 + k1;
//        i = rotateLeft(i, j1);
//        return i + j;
//    }
//
//    private final int G(int i, int j, int k) {
//        return i & k | j & (k ^ 0xFFFFFFFF);
//    }
//
//    private final int GG(int i, int j, int k, int l, int i1, int j1, int k1) {
//        i += G(j, k, l) + i1 + k1;
//        i = rotateLeft(i, j1);
//        return i + j;
//    }
//
//    private final int H(int i, int j, int k) {
//        return i ^ j ^ k;
//    }
//
//    private final int HH(int i, int j, int k, int l, int i1, int j1, int k1) {
//        i += H(j, k, l) + i1 + k1;
//        i = rotateLeft(i, j1);
//        return i + j;
//    }
//
//    private final int K(int i, int j, int k) {
//        return j ^ (i | k ^ 0xFFFFFFFF);
//    }
//
//    private final int KK(int i, int j, int k, int l, int i1, int j1, int k1) {
//        i += K(j, k, l) + i1 + k1;
//        i = rotateLeft(i, j1);
//        return i + j;
//    }
//
//    private final int bytesToInt(byte[] abyte0, int i) {
//        return abyte0[i] & 0xFF | abyte0[i + 1] << 8 & 0xFF00 | abyte0[i + 2] << 16 & 0xFF0000 | abyte0[i + 3] << 24 & 0xFF000000;
//    }
//
//    protected synchronized byte[] engineDigest() {
//        long l = (this.count << 3);
//        engineUpdate((byte) -128);
//        while ((this.count & 0x3F) != 56)
//            engineUpdate((byte)0);
//        for (int i = 0; i < 14; i++)
//            this.X[i] = bytesToInt(this.buffer, i * 4);
//        this.X[14] = (int)(l & 0xFFFFFFFFFFFFFFFFL);
//        this.X[15] = (int)(l >>> 32L & 0xFFFFFFFFFFFFFFFFL);
//        processBlock();
//        byte[] abyte0 = new byte[16];
//        intToBytes(abyte0, 0, this.H1);
//        intToBytes(abyte0, 4, this.H2);
//        intToBytes(abyte0, 8, this.H3);
//        intToBytes(abyte0, 12, this.H4);
//        engineReset();
//        return abyte0;
//    }
//
//    protected void engineReset() {
//        this.H1 = 1732584193;
//        this.H2 = -271733879;
//        this.H3 = -1732584194;
//        this.H4 = 271733878;
//        this.count = 0;
//    }
//
//    protected synchronized void engineUpdate(byte byte0) {
//        this.buffer[this.count & 0x3F] = byte0;
//        if ((this.count & 0x3F) == 63) {
//            for (int i = 0; i < 16; i++)
//                this.X[i] = bytesToInt(this.buffer, i * 4);
//            processBlock();
//        }
//        this.count++;
//    }
//
//    protected synchronized void engineUpdate(byte[] abyte0, int i, int j) {
//        int k = i;
//        for (; (this.count & 0x3F) != 63 && j > 0; j--)
//            engineUpdate(abyte0[k++]);
//        if (j == 0)
//            return;
//        engineUpdate(abyte0[k++]);
//        while (--j > 64) {
//            for (int l = 0; l < 16; l++) {
//                this.X[l] = bytesToInt(abyte0, k);
//                k += 4;
//            }
//            this.count += 64;
//            j -= 64;
//            processBlock();
//        }
//        for (int i1 = 0; i1 != j; i1++)
//            engineUpdate(abyte0[i1 + k]);
//    }
//
//    private final void intToBytes(byte[] abyte0, int i, int j) {
//        abyte0[i] = (byte)(j & 0xFF);
//        abyte0[i + 1] = (byte)(j >>> 8 & 0xFF);
//        abyte0[i + 2] = (byte)(j >>> 16 & 0xFF);
//        abyte0[i + 3] = (byte)(j >>> 24 & 0xFF);
//    }
//
//    private final synchronized void processBlock() {
//        int i = this.H1;
//        int j = this.H2;
//        int k = this.H3;
//        int l = this.H4;
//        i = FF(i, j, k, l, this.X[0], 7, -680876936);
//        l = FF(l, i, j, k, this.X[1], 12, -389564586);
//        k = FF(k, l, i, j, this.X[2], 17, 606105819);
//        j = FF(j, k, l, i, this.X[3], 22, -1044525330);
//        i = FF(i, j, k, l, this.X[4], 7, -176418897);
//        l = FF(l, i, j, k, this.X[5], 12, 1200080426);
//        k = FF(k, l, i, j, this.X[6], 17, -1473231341);
//        j = FF(j, k, l, i, this.X[7], 22, -45705983);
//        i = FF(i, j, k, l, this.X[8], 7, 1770035416);
//        l = FF(l, i, j, k, this.X[9], 12, -1958414417);
//        k = FF(k, l, i, j, this.X[10], 17, -42063);
//        j = FF(j, k, l, i, this.X[11], 22, -1990404162);
//        i = FF(i, j, k, l, this.X[12], 7, 1804603682);
//        l = FF(l, i, j, k, this.X[13], 12, -40341101);
//        k = FF(k, l, i, j, this.X[14], 17, -1502002290);
//        j = FF(j, k, l, i, this.X[15], 22, 1236535329);
//        i = GG(i, j, k, l, this.X[1], 5, -165796510);
//        l = GG(l, i, j, k, this.X[6], 9, -1069501632);
//        k = GG(k, l, i, j, this.X[11], 14, 643717713);
//        j = GG(j, k, l, i, this.X[0], 20, -373897302);
//        i = GG(i, j, k, l, this.X[5], 5, -701558691);
//        l = GG(l, i, j, k, this.X[10], 9, 38016083);
//        k = GG(k, l, i, j, this.X[15], 14, -660478335);
//        j = GG(j, k, l, i, this.X[4], 20, -405537848);
//        i = GG(i, j, k, l, this.X[9], 5, 568446438);
//        l = GG(l, i, j, k, this.X[14], 9, -1019803690);
//        k = GG(k, l, i, j, this.X[3], 14, -187363961);
//        j = GG(j, k, l, i, this.X[8], 20, 1163531501);
//        i = GG(i, j, k, l, this.X[13], 5, -1444681467);
//        l = GG(l, i, j, k, this.X[2], 9, -51403784);
//        k = GG(k, l, i, j, this.X[7], 14, 1735328473);
//        j = GG(j, k, l, i, this.X[12], 20, -1926607734);
//        i = HH(i, j, k, l, this.X[5], 4, -378558);
//        l = HH(l, i, j, k, this.X[8], 11, -2022574463);
//        k = HH(k, l, i, j, this.X[11], 16, 1839030562);
//        j = HH(j, k, l, i, this.X[14], 23, -35309556);
//        i = HH(i, j, k, l, this.X[1], 4, -1530992060);
//        l = HH(l, i, j, k, this.X[4], 11, 1272893353);
//        k = HH(k, l, i, j, this.X[7], 16, -155497632);
//        j = HH(j, k, l, i, this.X[10], 23, -1094730640);
//        i = HH(i, j, k, l, this.X[13], 4, 681279174);
//        l = HH(l, i, j, k, this.X[0], 11, -358537222);
//        k = HH(k, l, i, j, this.X[3], 16, -722521979);
//        j = HH(j, k, l, i, this.X[6], 23, 76029189);
//        i = HH(i, j, k, l, this.X[9], 4, -640364487);
//        l = HH(l, i, j, k, this.X[12], 11, -421815835);
//        k = HH(k, l, i, j, this.X[15], 16, 530742520);
//        j = HH(j, k, l, i, this.X[2], 23, -995338651);
//        i = KK(i, j, k, l, this.X[0], 6, -198630844);
//        l = KK(l, i, j, k, this.X[7], 10, 1126891415);
//        k = KK(k, l, i, j, this.X[14], 15, -1416354905);
//        j = KK(j, k, l, i, this.X[5], 21, -57434055);
//        i = KK(i, j, k, l, this.X[12], 6, 1700485571);
//        l = KK(l, i, j, k, this.X[3], 10, -1894986606);
//        k = KK(k, l, i, j, this.X[10], 15, -1051523);
//        j = KK(j, k, l, i, this.X[1], 21, -2054922799);
//        i = KK(i, j, k, l, this.X[8], 6, 1873313359);
//        l = KK(l, i, j, k, this.X[15], 10, -30611744);
//        k = KK(k, l, i, j, this.X[6], 15, -1560198380);
//        j = KK(j, k, l, i, this.X[13], 21, 1309151649);
//        i = KK(i, j, k, l, this.X[4], 6, -145523070);
//        l = KK(l, i, j, k, this.X[11], 10, -1120210379);
//        k = KK(k, l, i, j, this.X[2], 15, 718787259);
//        j = KK(j, k, l, i, this.X[9], 21, -343485551);
//        this.H1 += i;
//        this.H2 += j;
//        this.H3 += k;
//        this.H4 += l;
//        for (int i1 = 0; i1 < this.X.length; i1++)
//            this.X[i1] = 0;
//    }
//
//    private final int rotateLeft(int i, int j) {
//        return i << j | i >>> 32 - j;
//    }
//}